package com.jiaqiang.chatgpt.interceptor;

import cn.hutool.http.ContentType;
import cn.hutool.http.Header;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import okhttp3.HttpUrl;
import okhttp3.Interceptor;
import okhttp3.Request;
import okhttp3.Response;
import org.jetbrains.annotations.NotNull;

import java.io.IOException;

/**
 * 自定义拦截器
 */
@Slf4j
public class OpenAiInterceptor implements Interceptor {

    /** OpenAi apiKey 需要在官网申请 */
    private final String apiKey;
    /** 访问授权接口的认证 Token */
    private final String authToken;

    public OpenAiInterceptor(String apiKey, String authToken) {
        this.apiKey = apiKey;
        this.authToken = authToken;
    }

    @NotNull
    @Override
    public Response intercept(Chain chain) throws IOException {
        // this.auth(apiKey, chain.request()) 来进行认证
        // 并通过 chain.proceed 方法将请求继续传递下去
        return chain.proceed(this.auth(apiKey, chain.request()));
    }

    private Request auth(String apiKey, Request original) {
        // 设置Token信息;如果没有此类限制，是不需要设置的。
        HttpUrl url =
                // original.url() 获取请求的 URL
                original.url()
                .newBuilder()
                // addQueryParameter 方法添加一个名为 “token” 的查询参数，值为 authToken.
                        // addQueryParameter 和 nginx.conf, 后端获取 token 的方式 对应起来
                .addQueryParameter("token", authToken)
                .build();

        // 创建了一个新的请求对象，并设置了认证相关的头部信息，包括 Authorization 头部和 Content-Type 头部
        return original.newBuilder()
//                .url(url)
                // 设置请求头, Authorization -> 是为了给 chatGpt 发请求的. apiKey 是密钥
                .header(Header.AUTHORIZATION.getValue(), "Bearer " + apiKey)
                // 设置 Content-Type -> application/json
                .header(Header.CONTENT_TYPE.getValue(), ContentType.JSON.getValue())
                .method(original.method(), original.body())
                .build();
    }

}
